import base64
import random
import this
import time
import unittest
from appium import webdriver
from appium.options.android import UiAutomator2Options
from appium.webdriver.common.appiumby import AppiumBy
from appium.webdriver.webdriver import WebDriver
from selenium.common import NoSuchElementException
from selenium.webdriver import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

from Android import UtilPcAndroidFile
from Android.bean.DyBean import DyBean
from Android.bean.ZiYuanBean import ZiYuanBean
from typing import List, Union, Dict, Optional
from appium.webdriver.webelement import WebElement
from util import Utilkv


########################################
#要在手机桌面上，桌面上必须有抖音图标
def getDriver():
    capabilities = dict(
        platformName='Android',  # 必填，指定平台为Android
        automationName='uiautomator2',  # 必填， 指定自动化引擎为UiAutomator2
        # deviceName='7llfge9ppv69uko7',  # 设备名称（Android中可以随意填写）
        # 多个设备，指定某个设备时必须写，
        # 通过 adb devices查看设备
        #不写默认当前应用
        # udid="7llfge9ppv69uko7",
        # 可以不写默认当前应用， 指定要自动化的应用包名 com.hollysos.manager.seedindustry
        #appPackage='com.miui.home',
        #可以不写默认当前页面，
        #appActivity='.launcher.Launcher',
        # 指定要启动的应用活动com.app.app2.MainActivity，mainLanuch.activity.LauncherActivity
        # language='en',  # 设置语言为英语,不写默认
        # locale='US'  # 设置区域为美国
        # 是否初始化手机环境，true=不初始化，记录手机数据，
        # #比如权限通过以后下次在启动就不会再次弹出再次授权,
        # 如果设置flash每次启动就会按照软件最开始状态运行
        # 比如不用每次都要从登录开始
        noReset=True,
        # adbExecTimeout=60000  # 将超时时间增加到60秒
    )

    # 定义Appium服务器URL测试地址
    appium_server_url = 'http://localhost:4723'
    # 启动测试
    driver = webdriver.Remote(appium_server_url, options=UiAutomator2Options().load_capabilities(capabilities))
    return driver

def getDriver2():
    capabilities = dict(
        platformName='Android',  # 必填，指定平台为Android
        automationName='uiautomator2',  # 必填， 指定自动化引擎为UiAutomator2
        noReset=True,
    )

    # 定义Appium服务器URL测试地址
    appium_server_url = 'http://localhost:4723'
    # 启动测试
    driver = webdriver.Remote(appium_server_url, options=UiAutomator2Options().load_capabilities(capabilities))
    return driver



def my_find_element(driver:webdriver,by:'', value:'') -> WebElement:
    try:
        element = driver.find_element(by, value)
        return element
    except NoSuchElementException as e:
        print(f'-------没找到：{value}')
        return None
    except Exception as e:
        print(f'----------查询元素错误：{e.args}')

'''
桌面翻页
'''
def findfanye():
    driver=getDriver()
    driver.swipe(638, 1450, 138,1450 , 500)


'''
手机桌面查找抖音，根据给的图标找到抖音应用
'''
def finddouyin():
    driver=getDriver()
    # fixImageFindScreenshotDims固定屏幕截图尺寸
    # fixImageTemplateSize固定大小的模板图像进行元素定位，以确保跨设备和分辨率的一致性
    # autoUpdateImageElementPosition:自动更新图像元素位置
    driver.update_settings({"fixImageFindScreenshotDims": True,
                            "fixImageTemplateSize": True,
                            "autoUpdateImageElementPosition": True})
    #识别抖音图标，然后点击抖音图标
    #open('默认是当前目录下', 'rb')
    base64_str = base64.b64encode(open('douyin.jpg', 'rb').read())
    base64_str = base64_str.decode('utf-8')
    # try:
     #识别到抖音图标后点击打开抖音
    driver.find_element(AppiumBy.IMAGE, base64_str).click()
    # except NoSuchElementException as e:
    #     print(f"===================未找到抖音图标{e.args}")
    #等待10秒
    # time.sleep(3)
    #退出抖音应用
    # driver.quit()







'''
相册选中方式的测试，直接进入相册
dy版本号：30.5.0
切记：不同版本号布局resourceId是不一样的,
这个不一样不是打包或者手机造成的，是开发人员修改造成的
'''
def xiangce():
    driver = getDriver()

    ##第一种查找方式，找第1个item，,索引0开始
    ##app版本号：30.5.0,是开发人员修改造成的
    _fangshi1 = 'new UiSelector().resourceId("com.ss.android.ugc.aweme:id/jyd").instance(0)'
    ##app版本号：30.6.0
    _fangshi1 = 'new UiSelector().resourceId("com.ss.android.ugc.aweme:id/jzv").instance(0)'
    driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, _fangshi1).click()
    time.sleep(3)

    ##第二种查找方式，找第2个item,索引时从1开始,获取的是第2条
    ## app版本号：30.5.0
    _fangshi2 = '(//android.widget.FrameLayout[@resource-id="com.ss.android.ugc.aweme:id/hlw"])[2]'
    ## app版本号：30.6.0
    _fangshi2 = '(//android.widget.FrameLayout[@resource-id="com.ss.android.ugc.aweme:id/hm5"])[2]'
    driver.find_element(AppiumBy.XPATH, _fangshi2).click()
    time.sleep(3)

    ##第三种查找方式，层级查找，逐级查找
    ##第3种方式，找第3个item,索引0开始
    ##查找RecyclerView标签
    _fangshi3 = 'new UiSelector().className("androidx.recyclerview.widget.RecyclerView")'
    ##获取RecyclerView标签
    list_view = driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,_fangshi3)
    ##获取所有RecyclerView标签中的第1个
    list_view = driver.find_elements(AppiumBy.ANDROID_UIAUTOMATOR, _fangshi3)[0]
    ##获取item，这里的index指的时原生getChildAt
    _listv_item = 'new UiSelector().className("android.widget.FrameLayout").index(2)'
    _listv_itemV=list_view.find_element(AppiumBy.ANDROID_UIAUTOMATOR,_listv_item)
    ##获取item的第2个子view，
    ##解释：并不是FrameLayout的第二个标签，而是_listv_itemV的第2个子view
    ##这里的index指的时原生getChildAt
    _listv_itemV_child='new UiSelector().className("android.widget.FrameLayout").index(1)'
    _listv_itemV_childV=_listv_itemV.find_element(AppiumBy.ANDROID_UIAUTOMATOR,_listv_itemV_child)
    ##获取第i个子view
    _listv_itemV_child_child = 'new UiSelector().className("android.widget.TextView").index(0)'
    _listv_itemV_child_childV = _listv_itemV_childV.find_element(AppiumBy.ANDROID_UIAUTOMATOR, _listv_itemV_child_child)
    _listv_itemV_child_childV.click()

    ##第4种查找方式
    #根据描述定位
    driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().description(", 未选中").instance(3)').click()

    ##第5种查找方式
    driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().className("android.widget.TextView").description(", 未选中").instance(3)').click()

    ##第6种查找方式
    #根据描述定位
    #driver.find_element(AppiumBy.XPATH,'//*[@text="最新"]')
    # ‘//’相对路径元素，‘*’任意元素，‘@’属性，‘[@text="搜索"]’元素的属性名和属性值
    # 总结:在当前页面上查找任意一个元素，这个元素带有text属性，text值是“最新”
    driver.find_elements(AppiumBy.XPATH, '//android.widget.TextView[@content-desc=", 未选中" or @content-desc=", 已选中"]')[4].click()






def testv():
    driver = getDriver()
    #歌曲列表RecyclerView
    listview = driver.find_element(AppiumBy.ID, 'com.ss.android.ugc.aweme:id/ck2')
    #获取歌曲横向排版的第1个歌曲
    listview.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().resourceId("com.ss.android.ugc.aweme:id/byo").instance(0)').click()
    #点击使用按钮
    listview.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'new UiSelector().text("使用，按钮").instance(0)').click()

'''
点击选择歌曲后
'''
def xuanzegequ_yongguo(driver,gequmingcheng):
    driver.find_element(AppiumBy.XPATH, '//android.widget.Button[@content-desc="用过"]').click()
    time.sleep(1)
    #如果没有此说明，说明列表有数据
    el = my_find_element(driver,AppiumBy.XPATH, '//*[@text="暂无最近使用音乐"]')
    if el is None:#有数据就在列表查找

        #//android.widget.Button[@text="动物世界主题曲"]
        #//android.widget.Button[@text="动物世界主题曲"]

        str = f'//android.widget.Button[@text="{gequmingcheng}"]'
       # el1=driver.find_element(AppiumBy.XPATH, '//*[@text="动物世界主题曲"]')
        # 查看用过里面有没有要搜索的音乐名称,
        el = my_find_element(driver, AppiumBy.XPATH, f'//*[@text="{gequmingcheng}"]')
        if el is not None:  # 有直接选择使用
            el.click()
        elif el is None:
            # 没有就去搜素
            sousuogequgequ(driver,gequmingcheng)
    # 如果不为null查找列表有没有想要的歌曲
    elif el is not None:#列表没有数据
        sousuogequgequ(driver,gequmingcheng)

    '''
搜索歌曲
'''
def sousuogequgequ(driver,gequmingcheng):
    # 点击搜索歌曲按钮
    driver.find_element(AppiumBy.XPATH, '//android.widget.Button[@content-desc="搜索"]').click()
    time.sleep(1)
    #搜索歌曲内容
    driver.find_element(AppiumBy.CLASS_NAME, 'android.widget.EditText').send_keys(gequmingcheng)
    time.sleep(1)
    #点击搜索
    driver.find_element(AppiumBy.XPATH, '//*[@text="搜索"]').click()
    time.sleep(1)

    #歌曲列表RecyclerView
    listview = driver.find_element(AppiumBy.ID, 'com.ss.android.ugc.aweme:id/ck2')
    #获取歌曲横向排版的第1个歌曲
    listview.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().resourceId("com.ss.android.ugc.aweme:id/byo").instance(0)').click()
    #点击使用按钮
    listview.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'new UiSelector().text("使用，按钮").instance(0)').click()
    time.sleep(1)
    # # # 设置音量
    # yinliang2(driver)
    # time.sleep(1)




'''
 点击顶部已经选择号的音乐，修改音量，让原音量最小，现有的音乐音量最大
'''
def yinliang(driver):
    #点击已经选择的音乐
    driver.find_element(AppiumBy.ID, 'com.ss.android.ugc.aweme:id/1fj').click()
    #弹出底部框，点击音乐
    driver.find_element(AppiumBy.XPATH, '//*[@text="音量"]').click()

    #原声滑动到底部，切记一定要加sleep
    time.sleep(2)
    driver.swipe(297, 1874, 297, 2206,300)
    #配乐滑动到顶部，切记一定要加sleep
    time.sleep(2)
    driver.swipe(789, 2068, 789, 1780, 300)
    #这里可以计算百分比进行点设置
    # driver.tap([(297, 2141)])
    # time.sleep(2)
    # #还要小一点声音
    # driver.tap([(297, 2150)])

    #触摸屏幕让设置声音的底部弹出框消失
    time.sleep(2)
    driver.tap([(540, 1180)])
def yinliang2(driver):
    #点击已经选择的音乐
    driver.find_element(AppiumBy.ID, 'com.ss.android.ugc.aweme:id/1fj').click()
    #原声音关闭
    driver.find_element(AppiumBy.ID, 'com.ss.android.ugc.aweme:id/qgq').click()
    # 触摸屏幕让设置声音的底部弹出框消失
    time.sleep(2)
    driver.tap([(540, 1180)])

def yinliang3(driver):
    try:
        # #点击已经选择的音乐
        # driver.find_element(AppiumBy.ID, 'com.ss.android.ugc.aweme:id/1fj').click()
        # 原声音关闭
        # driver.find_element(AppiumBy.ID, 'com.ss.android.ugc.aweme:id/qgq').click()
        driver.find_element(AppiumBy.XPATH, '//*[@text="原声开"]').click()
        # 触摸屏幕让设置声音的底部弹出框消失
        time.sleep(2)
        driver.tap([(540, 1180)])
        time.sleep(2)
    except NoSuchElementException as e:
        print(f'{e.args}')










'''
前提：
1、进入dy首页，
2、启动appium服务器,
命令:
npx appium --relaxed-security：启动appium服务器和adbshell命令
npx appium --use-plugins=images：启动appium服务器和图片识别定位
npx appium --relaxed-security --use-plugins=images：启动appium服务器和adbshell命令和图片识别定位

注意：一定要time.sleep(2)休眠，不然太快有时候页面还没有加载出来find_element查不到

'''
def runDy(driver:webdriver,dybean:DyBean):
    try:
        global zyindex
        #pc文件
        ziyuanb:ZiYuanBean = dybean.ziyuanList[zyindex]
        #----开始操作，phone_path=/storage/emulated/0/dy，，，，pc_path=D:\视频\美国女兵，，，，zyindex=1,,,,@us_aircraft_0=1237e8.mp4
        print(f'----开始操作，phone_path={dybean.phone_path}，，，，pc_path={dybean.pc_path}，，，，zyindex={zyindex},,,,{ziyuanb.filename}')
        # #手机目录
        # phone_path=UtilPcAndroidFile.phone_file_root_path+'/dy'
        # #判断目录是否存在
        # if(False==UtilPcAndroidFile.check_directory_exists(driver,phone_path)):
        #     UtilPcAndroidFile.create_file_on_android_mkdir(driver,phone_path)
        #记忆pc的路径，存储当前的文件
        Utilkv.shelve_set(dybean.pc_path,ziyuanb.filename)
        print(f'--取值{Utilkv.shelve_get(dybean.pc_path, '')}')

        #手机文件路径
        # phone_path=phone_path + '/1.mp4'
        phone_path=f'{dybean.phone_path}/{ziyuanb.filename}'
        #电脑文件路径
        # pc_path='D:\\dy\\shipin\\1.mp4'
        pc_path=ziyuanb.filepath
        #pc把文件发送到手机
        UtilPcAndroidFile.pcPushFileAndroid(driver,pc_path,phone_path)
        # 通知更新媒体库，让抖音选择相册时能显示出来
        UtilPcAndroidFile.update_media_gallery(driver, phone_path)
        # time.sleep(1)

        #主页加号
        #driver.find_element(AppiumBy.ID, 'com.ss.android.ugc.aweme:id/w9q').click()
        el=my_find_element(driver,AppiumBy.XPATH,'//*[@content-desc="拍摄，按钮"]')
        if el is None:
            return
        el.click()
        # driver.find_element(AppiumBy.ID, 'com.ss.android.ugc.aweme:id/w9q').click()
        time.sleep(1)

        #点击相册
        driver.find_element(AppiumBy.XPATH, '//*[@text="相册"]').click()
        time.sleep(1)

        _zyid='new UiSelector().className("android.widget.TextView").description(", 未选中").instance(0)'
        driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,_zyid).click()
        time.sleep(1)

        driver.find_element(AppiumBy.XPATH, '//*[@text="下一步"]').click()
        time.sleep(1)

        #随机音乐
        if dybean.suiji and len(dybean.gequList)>0:
            # 生成一个 1 到 10 之间的随机整数
            random_int = random.randint(0, len(dybean.gequList)-1)
            dybean.gequmingcheng=dybean.gequList[random_int]
            print(f'-----随机歌曲:random_int={random_int},歌曲={dybean.gequmingcheng}')

        if dybean.gequmingcheng is not None and dybean.gequmingcheng != '':
                el=my_find_element(driver,AppiumBy.XPATH, '//*[@text="选择音乐"]')
                if el is not None:
                    el.click()
                elif  el is None:
                    driver.find_element(AppiumBy.XPATH, '//*[@text="选择音乐"]').click()
                    time.sleep(1)
                # 搜索歌曲
                # gequHome(driver,dybean)
                    # 操作推荐，收藏，用过，搜索歌曲
                xuanzegequ_yongguo(driver, dybean.gequmingcheng)
                yinliang3(driver)

        #     try:
        #         driver.find_element(AppiumBy.XPATH, '//*[@text="选择音乐"]').click()
        #         time.sleep(1)
        #     except NoSuchElementException as e:
        #
        #         # 再次点击选择音乐
        #
        #     # sousuogequgequ(driver, dybean.gequmingcheng)
        #     #操作推荐，收藏，用过，搜索歌曲
        #     xuanzegequ(driver, dybean.gequmingcheng)
        #     # 设置音量
        #     yinliang2(driver)
        #     time.sleep(1)

        # 去发布的下一步
        driver.find_element(AppiumBy.XPATH, '//*[@text="下一步"]').click()
        time.sleep(1)
        #发布词，描述，话题
        driver.find_element(AppiumBy.ID, 'com.ss.android.ugc.aweme:id/f-x').send_keys(dybean.neirong)
        time.sleep(1)
        driver.find_element(AppiumBy.XPATH, '//*[@text="发作品"]').click()
        time.sleep(20)

        # 删除发布完成的手机文件
        UtilPcAndroidFile.delete_file_from_device(driver,phone_path)
        # 通知更新媒体库，让抖音选择相册时能显示出来
        UtilPcAndroidFile.update_media_gallery(driver, phone_path)
        time.sleep(2)
        print(f'----------发布完成，phone_path={phone_path}，，，，pc_path={pc_path}，，，，zyindex={ zyindex}------------------')
        zyindex+=1
        if zyindex<len(dybean.ziyuanList):
            runDy(driver,dybean)

    except Exception  as  e:
        print(f'{e.args}')
        print( f'---------------------运行异常，请回到抖音主页，phone_path={phone_path}，，，，pc_path={pc_path}，，，，zyindex={zyindex}------------------')
        runDy(driver, dybean)


def gequHome(driver:webdriver,dybean:DyBean):
    # 搜索歌曲
    if dybean.gequmingcheng is not None and dybean.gequmingcheng != '':
        try:
            driver.find_element(AppiumBy.XPATH, '//*[@text="选择音乐"]').click()
            time.sleep(1)
        except NoSuchElementException as e:
            # 去掉默认音乐
            driver.find_element(AppiumBy.ID, 'com.ss.android.ugc.aweme:id/k9p').click()
            # 再次点击选择音乐
            driver.find_element(AppiumBy.XPATH, '//*[@text="选择音乐"]').click()
            time.sleep(1)
        # sousuogequgequ(driver, dybean.gequmingcheng)
        # 操作推荐，收藏，用过，搜索歌曲
        xuanzegequ_yongguo(driver, dybean.gequmingcheng)

        # 设置音量
        yinliang2(driver)
        time.sleep(1)




# ziyuanList: List[ZiYuanBean] =[]
zyindex=0
# dybean=DyBean()


'''
前提：
1、进入dy首页，
2、启动appium服务器,
命令:
npx appium --relaxed-security：启动appium服务器和adbshell命令
npx appium --use-plugins=images：启动appium服务器和图片识别定位
npx appium --relaxed-security --use-plugins=images：启动appium服务器和adbshell命令和图片识别定位
'''
def start(driver:webdriver):

    # 手机目录
    phone_path = UtilPcAndroidFile.phone_file_root_path + '/dy'
    # 判断目录是否存在
    if (False == UtilPcAndroidFile.check_directory_exists(driver, phone_path)):
        #创建
        UtilPcAndroidFile.create_file_on_android_mkdir(driver, phone_path)

    dybean = DyBean()
    dybean.gequmingcheng ='超好听英文女唱(DJ版)'#'动物世界主题曲'#'@海心音乐创作的原声'#
    dybean.neirong ='#美妆 #女大学生 #身材管理 #女性智慧 #女生 美国 身材  健身 白人美女 自拍 臭美' #'#动物  #野生动物零距离 #神奇动物在抖音 #动物世界 老鹰'
    #dybean.pc_path='D:\\视频\\自拍美女\\20240715'
    dybean.pc_path = 'D:\\视频\\自拍美女\\20240715-2'
    dybean.gequList=['超好听英文女唱(DJ版)','Bleeding Love（七元版）','时光晃呀晃 (剪辑版)','云朵变成棉花糖（剪辑版）']
    dybean.ziyuanList=UtilPcAndroidFile.ziyuan(dybean.pc_path)
    dybean.suiji=True
    #把视频存在手机这个目录下
    dybean.phone_path=phone_path
    # 处理中断，再次启动时从中断的索引开始
    filename = Utilkv.shelve_get(dybean.pc_path, '')
    if '' != filename:
        for index, value in enumerate(dybean.ziyuanList):
            print(f"索引: {index}, 值: {value}")
            if filename == value.filename:
                global zyindex
                zyindex = index
                break

    runDy(driver,dybean)
    driver.lock()



'''
前提：
1、进入dy首页，
2、启动appium服务器,
命令:
npx appium --relaxed-security：启动appium服务器和adbshell命令
npx appium --use-plugins=images：启动appium服务器和图片识别定位（要安装插件）
npx appium --relaxed-security --use-plugins=images：启动appium服务器和adbshell命令和图片识别定位
'''
if __name__ == '__main__':
    print('=========开始===============')

    # dybean = DyBean()
    # dybean.gequmingcheng = '@海心音乐创作的原声'  # '动物世界主题曲'
    # dybean.neirong = '#美国 #美国女兵 #美国航母 #女兵帅爆了'  # '#动物  #野生动物零距离 #神奇动物在抖音 #动物世界 老鹰'
    # dybean.pc_path = 'D:\\视频\\美国女兵'
    # dybean.ziyuanList = UtilPcAndroidFile.ziyuan(dybean.pc_path)
    # global ziyuanList
    # gequHome(getDriver(),dybean)
    start(getDriver())

    # time.sleep(5)
    # getDriver().lock(5)
    print('=========结束===============')




